"""
给定一个二叉搜索树，编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。

说明：
你可以假设 k 总是有效的，1 ≤ k ≤ 二叉搜索树元素个数。

示例 1:

输入: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
输出: 1
示例 2:

输入: root = [5,3,6,2,4,null,null,1], k = 3
       5
      / \
     3   6
    / \
   2   4
  /
 1
输出: 3
进阶：
如果二叉搜索树经常被修改（插入/删除操作）并且你需要频繁地查找第 k 小的值，你将如何优化 kthSmallest 函数？

作者：力扣 (LeetCode)
链接：https://leetcode-cn.com/leetbook/read/tencent/x5tjl5/
来源：力扣（LeetCode）
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
"""


class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:

    def kthSmallest(self, root: TreeNode, k: int) -> int:
        values = lambda x: [] if not x else values(x.left) + [x.val] + values(x.right)
        arr = values(root)
        return arr[k - 1]

    def kthSmallest2(self, root: TreeNode, k: int) -> int:
        self.flag = True
        self.count = 0
        self.res = None
        self.inorderTraversal(root, k)
        return self.res

    def inorderTraversal(self, root: TreeNode, k: int):
        if root is not None and self.flag:
            self.inorderTraversal(root.left, k)
            self.count += 1
            if self.count == k:
                self.flag = False
                self.res = root.val
            self.inorderTraversal(root.right, k)